BOJ_14921_용액 합성하기

투 포인터(Two-Pointers)를 사용해서 0에 가까운 합을 찾는 문제

입력이 정렬되어 들어오기 때문에 투포인터를 떠올리는 것까지는 어렵지 않았지만,
포인터를 넘기는 기준을 잘못 잡아서 틀렸었다.

두 수의 합이 지금까지 구한 가장 0에 가까운 수보다 작으면 -> end -= 1
크면 -> start += 1 을 해줬는데
이는 이전에 구했던 가장 0에 가까운 수와의 크기 비교일 뿐이라서
0에 더 가까운 조합을 놓칠 수 있다

따라서 정확한 방식으로 하려면 포인터 조작의 기준을 0으로 해야 한다
더한 값이 0보다 크다면, 더 작은 수가 필요하기 때문에 end -= 1을 한다
반대로 더한 값이 0보다 작다면, 더 큰 수가 필요하기 때문에 start += 1을 해준다

이렇게 해야 0에 가까운 합을 찾을 수 있다

import sys  
  
# 투포인터  
  
input = sys.stdin.readline  
  
N = int(input())  
values = list(map(int, input().split()))  
  
start = 0  
end = N - 1  
zero_friend = sys.maxsize  
origin = sys.maxsize  
  
while start < end:  
    plus = values[start] + values[end]  
  
    if abs(plus) < zero_friend:  
        zero_friend = abs(plus)  
        origin = plus  
  
    if plus < 0:  
        start += 1  
  
    else:  
        end -= 1  
  
print(origin)